;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Sarkoth Goldfind Bot V1.0
;Made by nV
;Resolution = 1680x1050
;Works for Demon Hunters only (unless you change stuff around, which can be done easily)
;Recommended difficulty for squishy DH in GF gear = Hell. Makes about 100k/hr with 130% GF.
;Recommended difficulty for other characters that can sustain 2-3 hits from Act 1 mobs = Inferno. Makes probably 200k/hr with 130% GF.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hotkey Setups;
HotKeySet ("{SPACE}","pause") ;pause the script
HotKeySet ("q","quit") ;terminate loop, must wait until run finishes

;Logging And Runtime Variables;
Global $running = True
Global $log     = "" ;holds all logged data before it is written to file
Global $fName   = "Logs\" & @YEAR & "-" & @MON & "-" & @WDAY & " " & @HOUR & " " & @MIN & " " & @SEC & ".log" ;file name of log based on date and time
Global $sold    = False

;Loot Preferences;
Global $lootMagics  = True
Global $lootRares   = True
Global $lootSets    = True
Global $lootLegends = True

;General Data;
Global $startC1[2] = [75,379] ;coord for start/resume game - top left
Global $startC2[2] = [368,427] ;coord for start/resume game - bottom right
Global $msgC1[2]   = [622,443] ;coord for max input box - top left
Global $msgC2[2]   = [1051,564] ;coord for max input box - bottom right
Global $okC1[2]    = [752,594] ;coord for ok (max input box) - top left
Global $okC2[2]    = [917,631] ;coord ofr ok (max input box) - bottom right
Global $stashC1[2] = [912,223] ;coord for stash - top left
Global $stashC2[2] = [945,261] ;coord for stash - bottom right
Global $inputWait  = 15 ;how long to wait for "too much input" warning, in minutes

;Color Values;
Global $lHex = 0xBF642F ;hex color for legendaries
Global $sHex = 0x00CC00 ;hex color for sets
Global $rHex = 0xFFFF00 ;hex color for rares
Global $mHex = 0x6363EF ;hex color for magics

;General Statistics;
Global $runs    = 0 ;how many runs were done
Global $danks   = 0 ;how many times dank cellar was active
Global $repairs = 0 ;how many repairs were performed
Global $time    = 0 ;average run time
Global $inputs  = 0 ;how many times max input box came up
Global $clears  = 0 ;how many times inventory was cleared

;Item Statistics;
Global $sets    = 0 ;how many set pieces were picked up
Global $legends = 0 ;how many legendaries were picked up
Global $rares   = 0 ;how many rares were picked up
Global $magics  = 0 ;how many magics were picked up

;User Specific Variables;
Global $tp  = "t" ;key for town portal
Global $inv = "i" ;key for inventory

;Skills;
;(demon hunter)
Global $fog  = "1" ;key for fog
Global $ferr = "2" ;key for ferrets
Global $prep = "3" ;key for preparation
Global $calt = "4" ;key for caltrops

;(wizard)
Global $tele	= "1"	;key for teleport
Global $met		= "2"	;key for meteor
Global $hydra	= "3"	;key for archon mode
Global $eshld	= "4"	;key for energy shield

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to make the game from the main Diablo III screen.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func makeGame()
   If checkInput() Then ;input box there
	  pressOK() ;press ok..
	  Sleep($inputWait * 60 * 1000) ;sleep for delay time needed to reset timer
   EndIf
   Sleep(Random(4000,6000,1)) ;sleep for a wihle in the lobby
   $x = Random($startC1[0], $startC2[0], 1) ;grab a random x coordinate from the "start/resume game" bounds
   $y = Random($startC1[1], $startC2[1], 1) ;grab a random y coordinate from the "start/resume game" bounds
   moveClick($x,$y) ;start game
   Sleep(Random(4000,4500)) ;sleep for a while to account for game start delay
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to move from the checkpoint (between old ruins wp and dank) to the dank cellar. Also checks to see if repairs are needed.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func moveToDank()
   $coord = PixelSearch(1232,0,1321,98,0xFFE000,2) ;look for the low durability notice
   If Not @error Then ;there's low durability
	  repair() ;start repair function
   EndIf

   If Mod($danks,6) = 0 And Not $danks = 0 And Not $sold Then ;clear inventory every 10 runs(successes)
	  $sold = True
	  clearInventory()
   EndIf

   Sleep(Random(500,600))
   Send($eshld) ;precast energy shield
   Sleep(Random(100,300))
   
   $offsetX = Random(-2,2,1)
   $offsetY = 0
   moveTo(477,218,$offsetX,$offsetY,False,800) ;make 1st leg of journey
   Sleep(Random(100,300))
   
   $offsetX = Random(-2,2,1)
   $offsetY = 0
   MouseMove(50 + $offsetX,410 + $offsetY) ;teleport cursor location
   Send($tele)
   Sleep(Random(400,500))
   Send($tele)
   Sleep(Random(400,500))
   Send($tele)
   Sleep(Random(300,400))
   moveTo(58,358,$offsetX,$offsetY,False,1000)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to attack (using left or right mouse click skill, according to $attackType) 7-10 times where the mouse is currently located.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func attack($attackType)
   $numAttacks = Random(3,5,1) ;how many times to attack - note, since counting from 0, the range is actually 7-10
   Send("{SHIFTDOWN}") ;hold down shift
   For $i = 0 To $numAttacks Step 1 ;count through all the attacks
	  Sleep(250 + Random(50,100)) ;put delay to account for attack cooldown
	  MouseClick($attackType) ;attack
   Next
   Send("{SHIFTUP}") ;release shift
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to detect whether or not the dank cellar is open or closed. If it exists, control is passed to the killSarkoth() function. Regardless, restart() is called at the end.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func searchForDank()
   $mSpeed = Random(9,23,1)
   MouseMove(970 + Random(-2,2,1),260 + Random(-2,2,1),$mSpeed) ;hover over the cellar (if there) so the pixelsearch can find the correct pixel
   Sleep(Random(200,300,1))
   $coord = PixelSearch(890,151,1033,332,0x87C2F9,0) ;search for the specific blue pixel that signifies the dank cellar when highlighted 
   If Not @error Then ;cellar exists
	  $danks+=1
	  MouseClick("left")
	  Sleep(Random(800,1000,1)) ;delay for a while
	  killSarkoth() ;begin main kill script
	  restart(1)
   Else
	  restart(2) ;leave the game and restart the game loop
   EndIf
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to teleport to town and repair items after a low durability notice has popped up.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func repair()
   $repairs+=1
   Send("t") ;tp to town
   Sleep(Random(7300,8100)) ;wait for tp to finish, and a bit longer
   
   $offsetX = Random(-2,2,1) 
   $offsetY = Random(-2,2,1)
   moveTo(1392,163,$offsetX,$offsetY,False,800) ;1st step of 1
   
   Sleep(Random(900,1200,1)) ;wait for walk to finish
   
   moveClick(987,75) ;click on the blacksmith
   
   Sleep(1300 + Random(100,300)) ;wait for walk to finish 
   
   moveClick(494,468) ;click on repair tab
   
   Sleep(Random(550,650,1)) ;slow down a bit
   
   moveClick(272,578) ;click on repair all
   Sleep(Random(100,250,1))
   Send("{ESC}") ;get out of the blacksmith screen
   
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)
   moveTo(650,896,$offsetX,$offsetY,False,800) ;move back towards tp
   
   $offsetX = $offsetX * -1
   $offsetY = $offsetY * -1
   moveTo(148,945,$offsetX,$offsetY,False,800) ;click on tp to go through
   
   moveClick(551,475)
   
   Sleep(Random(2700,3200)) ;wait to go through tp
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to teleport to town, stash certain items, and sell the others.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func clearInventory()
   $clears+=1
   Send($tp)
   Sleep(Random(7300,8100)) ;wait for tp to finish, and a bit longer
   stashItems()
   sell()
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to click on stash and put legendaries and sets in.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func stashItems()
   $x = Random($stashC1[0],$stashC2[0],1)
   $y = Random($stashC1[1],$stashC2[1],1)
   moveClick($x,$y) ;move to stash
   
   Sleep(Random(1000,1200))
   
   inventory(0x4E2A0E,2) ;store legendaries
   inventory(0x887515,5) ;store sets

   Sleep(Random(1000,1200))

   Send("{ESC}") ;exit out of stash
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to go to the merchant and sell items there.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func sell()
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)
   moveClick(1511 + $offsetX, 108 + $offsetY) ;move up
   Sleep(Random(3000,3250))
   moveClick(777 + $offsetX * -1, 221  + $offsetY * -1) ;click on merchant
   Sleep(Random(1500,2500))
   
   inventory(0x132542,3) ;sell magics
   If Random(0,1) = 0 Then
	  inventoryAll()
   EndIf
	  
   Sleep(Random(250,350))
   Send("{ESC}") ;exit out of merchant
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)   
   moveClick(694 + $offsetX,910 + $offsetY) ;move back down
   Sleep(Random(1000,1250))
   moveClick(513 + $offsetX * -1, 891 + $offsetY * -1) ;again
   Sleep(Random(750,1000))
   moveClick(230 + Random(-3,3,1), 471 + Random(-3,3,1)) ;move into tp
   Sleep(Random(2650,2850))
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to iterate through the coordinates of inventory blocks and right click on certain blocks according to $color and $tolerance.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func inventory($color,$tolerance)
   For $yC = 0 To 5 Step 1 ;5 rows
	  For $xC = 0 To 9 Step 1 ;10 columns
		 $mSpeed = Random(9,23,1)
		 
		 $x = (1184) + ($xC * 44) + ($xC * 4) ;1184 is default x, xC * 44 is the other side of the block, $xC * 4 is the dead space between 2 blocks. Split up for convenience.
		 $y = (570) + ($yC * 43) + ($yC * 4) ;same as above
			
		 $coord = PixelSearch($x,$y,$x + 45,$y + 43,$color,$tolerance) ;search block for $color
		 If Not @error Then ;$color is there
			MouseMove(Random($x,$x + 45,1), Random($y,$y + 43,1), $mSpeed) ;move to it
			MouseClick("right") ;stash/sell it
		 EndIf
	  Next
   Next
EndFunc

func inventoryAll()
   For $yC = 0 To 5 Step 1 ;5 rows
	  For $xC = 0 To 9 Step 1 ;10 columns
		 $mSpeed = Random(9,23,1)
		 
		 $x = (1184) + ($xC * 44) + ($xC * 4) ;1184 is default x, xC * 44 is the other side of the block, $xC * 4 is the dead space between 2 blocks. Split up for convenience.
		 $y = (570) + ($yC * 43) + ($yC * 4) ;same as above

		 MouseMove(Random($x,$x + 45,1), Random($y,$y + 43,1), $mSpeed) ;move to it
		 MouseClick("right") ;stash/sell it
	  Next
   Next
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to move to Sarkoth, kill him, and collect the gold that drops.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func killSarkoth()
   $sold = False
   
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)
   moveTo(230,844,$offsetX,$offsetY,False,400) ;move halfway down the hallway
   $offsetX = -1 * $offsetX
   $offsetY = -1 * $offsetY
   moveTo(650,492,$offsetX,$offsetY,False,100) ;position character in front of the doorway to Sarkoth
   ;Sleep(Random(300,400,1)) ;sleep before beginning to fire
	  
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)
   $mSpeed = Random(4,9,1)
   MouseMove(469 + $offsetX, 191 + $offsetY,$mSpeed)
   
   ;Sleep(Random(200,300,1))
   Send($hydra) ;send out hydra at sarkoth
   Sleep(Random(350,450)) ;sleep for a while
   Send($met)
   Sleep(Random(500,600,1)) ;sleep for a while
   MouseDown("right") ;blow sarkoth away
   Sleep(Random(3000,3100,1)) ;sleep for a while
   MouseUp("right")
   Sleep(Random(300,400,1))
   Send("{SHIFTDOWN}")
   Sleep(Random(200,300,1))
   MouseClick("left")
   Sleep(Random(400,500,1))
   MouseClick("left")
   Sleep(Random(400,500,1))
   MouseClick("left")
   Sleep(Random(200,300,1))
   Send("{SHIFTUP}")
   
   ;$offsetX = Random(-2,2,1)
   ;$offsetY = Random(-2,2,1)
   ;moveClick(599 + $offsetX, 302 + $offsetY) ;move up to kill stragglers
   
   ;$mSpeed = Random(9,23,1)
   ;$offsetX = Random(-2,2,1)
   ;$offsetY = Random(-2,2,1)
   ;MouseMove(431 + $offsetX, 256 + $offsetY,$mSpeed)
   ;attack("left") ;kill stragglers on left
   
   ;$mSpeed = Random(9,23,1)
   ;$offsetX = Random(-2,2,1)
   ;$offsetY = Random(-2,2,1)
   ;MouseMove(658 + $offsetX, 159 + $offsetY,$mSpeed)
   ;attack("left") ;kill stragglers on right
   
   ;$offsetX = Random(-2,2,1)
   ;$offsetY = Random(-2,2,1)
   ;moveClick(404 + $offsetX, 147 + $offsetY)
   ;Sleep(Random(1000,1500,1))
   
   ;$offsetX = Random(-2,2,1)
   ;$offsetY = Random(-2,2,1)
   ;moveClick(1377 + $offsetX, 636 + $offsetY)
   ;Sleep(Random(1000,1500,1))
   
   pickit()
   
   Sleep(Random(1000,1500)) ;sleep before restarting script 
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to move to indicated ($x,$y) with offsets. Boolean $castFog is whether or not fog needs to be used when running.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func moveTo($x,$y,$offsetX,$offsetY,$castFog,$delay)
   moveClick($x + $offsetX,$y + $offsetY) ;move to position
   Sleep(Random(625,825,1)) ;sleep before casting fog (this is so the character possibly dodges attacks from a zombie and also makes it last longer.)
   Sleep(Random($delay,$delay+100,1)) ;sleep for a while before exiting out of function
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to leave the game.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func leaveGame($castTP)
   If $castTP Then
	  Sleep(Random(150,250,1))
	  Send($tp)
	  Sleep(Random(6800,7200,1))
   EndIf
   
   Sleep(Random(500,600)) ;sleep for a minute
   Send("{ESC}") ;depress escape
   moveClick(839,562) ;click leave game
   Sleep(Random(9000,11000)) ;sleep while leave game is active
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to move the mouse to given $x,$y and click to move there.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func moveClick($x,$y)
   $mSpeed = Random(9,23,1)
   MouseMove($x,$y,$mSpeed)
   MouseClick("left")
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to pause the thread for 25 seconds.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func pause()
   Sleep(25000)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to search for legendaries, sets, rares and magics. Control is passed to search(), which picks up items if found.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func pickit()
   $offsetX = Random(-2,2,1)
   $offsetY = Random(-2,2,1)
   MouseMove(0,0)
   sleep(random(500,600,1))
   MouseDown("left")
   sleep(random(1800,2100,1))
   MouseMove(850 + $offsetX, 0, random(4,6,1))
   sleep(random(800,1100,1))
   MouseMove(370 + $offsetX, 812 + $offsetY, 2)
   sleep(random(300,600,1))
   MouseUp("left")
   
   
   ;moveClick(556 + $offsetX, 497 + $offsetY)
   ;Sleep(Random(900,1000,1))
   
   ;moveClick(591 + $offsetX, 259 + $offsetY)
   ;Sleep(Random(900,1000,1))
   
   ;moveClick(1272 + $offsetX, 630 + $offsetY)
   ;Sleep(Random(900,1000,1))
   
   ;moveClick(644 + $offsetX, 210 + $offsetY)
   ;Sleep(Random(900,1000,1))
   
   If $lootLegends Then
	  $tries = 0
	  While (search($lHex,0,1050) And $tries < 2) ;search for legendaries
		 $legends+=1 ;increment legendary counter
		 $tries+=1
		 logInfo("FOUND LEGENDARY")
		 Sleep(Random(1250,1350,1))
	  WEnd
   EndIf
   
   If $lootSets Then
	  $tries = 0
	  While (search($sHex,0,1050) And $tries < 2) ;search for sets
		 $sets+=1 ;increment sets counter
		 $tries+=1
		 logInfo("FOUND SET")
		 Sleep(Random(1250,1350,1))
	  WEnd
   EndIf

   If $lootRares Then
	  $tries = 0
	  While (search($rHex,0,800) And $tries < 3) ;search for rares
		 $rares+=1 ;increment rares counter
		 $tries+=1
		 logInfo("FOUND RARE")
		 Sleep(Random(1250,1350,1))
	  WEnd
   EndIf
   
   If $lootMagics Then
	  $tries = 0
	  While (search($mHex,0,1050) And $tries < 5) ;search for magics
		 $magics+=1
		 $tries+=1
		 Sleep(Random(1250,1350,1))
	  WEnd
   EndIf
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to search for given $color with $tolerance. If found, it picks the found item up.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func search($color,$tolerance,$optY)
   $coord = PixelSearch(0,0,1680,$optY,$color,$tolerance) ;look for given color with given tolerance
   If Not @error Then ;color exists 
	  moveClick($coord[0],$coord[1]) ;pick it up
	  Return True ;return true saying we found the color / picked an item
   Else
	  Return False ;found nothing
   EndIf
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to check for the realm down thing before making a game. Searches for 3 specific colors that exist within the box. If all three are found, the box is assumed to be present.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func checkInput()
   $coord = PixelSearch($msgC1[0],$msgC1[1],$msgC2[0],$msgC2[1],0x1F0C0A,0) ;check for 1st color in box
   If @error Then ;color is not there - box is not there
	  Return False
   EndIf
   $coord = PixelSearch($msgC1[0],$msgC1[1],$msgC2[0],$msgC2[1],0xC1934C,0) ;check for 2nd color in box
   If @error Then ;color is not there - box is not there
	  Return False
   EndIf
   $coord = PixelSearch($msgC1[0],$msgC1[1],$msgC2[0],$msgC2[1],0x1F0C0A,0) ;check for 3rd color in box
   If @error Then ;color is not there - box is not there
	  Return False
   EndIf
   Return True ;if made it this far, then the box is there
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to press the OK button on the realm down box in random x,y coordinates.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func pressOK()
   $x = Random($okC1[0],$okC2[0],1)
   $y = Random($okC1[1],$okC2[1],1)
   moveClick($x,$y)
EndFunc

func logInfo($inf)
   $log = $log & $inf & @CRLF
EndFunc

func quit()
   $running = False
   MsgBox(0,"Message","Wait for run to finish.")
   logInfo(@CRLF)
   logInfo("Runs: " & $runs)
   logInfo("Danks: " & $danks)
   logInfo("Success: " & ($danks/$runs * 100))
   logInfo("Repairs: " & $repairs)
   logInfo("Inputs: " & $inputs)
   logInfo("Inventory clears: " & $clears)
   logInfo("Legendaries: " & $legends)
   logInfo("Sets: " & $sets)
   logInfo("Rares: " & $rares)
   logInfo("Magics: " & $magics)
   FileWriteLine($fName,$log & @CRLF & "END: " & @YEAR & "-" & @MON & "-" & @WDAY & " " & @HOUR & " " & @MIN & " " & @SEC)
EndFunc

func active()
   If Not WinActive("Diablo III") Then
	  Return False
   Else
	  Return True
   EndIf
EndFunc

func hibernate()
   Sleep(10 * 60 * 1000) ;sleeps for 10 minutes (10m * 60s * 1000ms)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to call all of the necessary functionalities of a botted Sarkoth run.;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

func mainGameLoop()
   while 1
	  If $running Then
		 $runs+=1 ;increment runs
		 Sleep(2000) ;sleep for a static amount of time (so you can get everything into position after starting script)
		 makeGame() ;make game
		 moveToDank() ;move to dank cellar
		 searchForDank() ;search for the dank cellar pixels
	  EndIf
   wend
EndFunc

FileWriteLine($fName,"START: " & @YEAR & "-" & @MON & "-" & @WDAY & " " & @HOUR & " " & @MIN & " " & @SEC & @CRLF & @CRLF)
mainGameLoop()

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Function to restart the main bot loop by leaving the game and recalling mainGameLoop().;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;code 0 = prevent death
;code 1 = tp out and exit
;code 2 = exit

func restart($code)
   If $code = 0 Then ;prevent death, try to tp out if not dead, leave game
	  Sleep(Random(50,100,1))
	  moveClick(1214 + Random(-3,3,1), 858 + Random(-3,3,1)) ;move down
	  Sleep(Random(250,350,1))
	  Send($calt) ;leave caltrops behind 
	  Sleep(Random(150,200,1))
	  moveClick(1173 + Random(-3,3,1), 749 + Random(-3,3,1)) ;further down
	  Sleep(Random(150,200,1))
	  Send($calt) ;lay caltrops to tp out in
	  If dead() Then
		 restart(False) ;exit out
	  Else
		 leaveGame(True) ;tp then exit
	  EndIf
   EndIf 
   
   If $code = 1 Then ;tp out and leave
	  leaveGame(True)
   EndIf
	  
   If $code = 2 Then ;just exit
	  leaveGame(False)
   EndIf
	  
EndFunc